package proxy;

import com.dys.proxy2.DoSomeService;
import com.dys.proxy2.DoSomeServiceImpl;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: 疾风
 * @ClassName: SomeProxy
 * @Description: 测试动态代理
 * @CreateDate: 2024/10/21
 * @Version: v1.0.0
 */
public class SomeProxy2 {

    /**
     * JDK动态代理
     */
    @Test
    public void testProxy() {
        // 1.获取目标对象
        DoSomeService target = new DoSomeServiceImpl();
        // 2.获取代理对象
        DoSomeService proxy = (DoSomeService) Proxy.newProxyInstance(SomeProxy2.class.getClassLoader(), // 获取类加载器
                target.getClass().getInterfaces(), // 获取目标对象实现的所有接口
                new InvocationHandler() { // 提供一个InvocationHandler的方法
                    /**
                     * 该方法是代理对象执行目标对象方法的回调方法
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method);
                        System.out.println(args);
                        System.out.println("-------start--------");
                        // 调用目标对象的方法
                        // String msg = target.doSomething();
                        Object result = method.invoke(target, args);
                        System.out.println("-------end--------");
                        // return msg.toUpperCase();
                        return result;
                    }
                });
        // 3.通过代理对象执行方法
        System.out.println("proxy.doSomething() = " + proxy.doSomething());
        proxy.doSomeTow();
    }
}
